home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / alpha.arc / NETUSER.C < prev    next >
C/C++ Source or Header  |  1988-03-22  |  3KB  |  148 lines

  1. /* Miscellaneous format conversion subroutines */
  2.  
  3. #include <ctype.h>
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "netuser.h"
  7. int net_error;
  8.  
  9. #define LINELEN 256
  10.  
  11. /* Convert Internet address in ascii dotted-decimal format (44.0.0.1) to
  12.  * binary IP address
  13.  */
  14. int32
  15. aton(s)
  16. register char *s;
  17. {
  18.     int32 n;
  19.     int atoi();
  20.     register int i;
  21.  
  22.     n = 0;
  23.     for(i=24;i>=0;i -= 8){
  24.         n |= (int32)atoi(s) << i;
  25.         if((s = index(s,'.')) == NULLCHAR)
  26.         break;
  27.         s++;
  28.     }
  29.     return n;
  30. }
  31. /* Resolve a host name into an IP address. IP addresses in dotted-decimal
  32.  * notation are distinguished from domain names by enclosing them in
  33.  * brackets, e.g., [44.64.0.1]
  34.  */
  35. int32
  36. resolve(host)
  37. char *host;
  38. {
  39.     register char *cp,*cp1;
  40.     int i;
  41.     char hostent[LINELEN];
  42.     FILE *sfile;
  43.     static struct {
  44.         char *name;
  45.         int32 address;
  46.     } cache;
  47.  
  48.     if(*host == '['){
  49.         /* Brackets indicate IP address in dotted-decimal form */
  50.         return aton(host + 1);
  51.     }
  52.     if(cache.name != NULLCHAR && strcmp(cache.name,host) == 0)
  53.         return cache.address;
  54.  
  55.     /* Not a numerical IP address, search the host table */
  56.     if((sfile = fopen(hosts,"r")) == NULL){
  57.         return 0;
  58.     }
  59.     while (!feof(sfile)){
  60.         fgets(hostent,LINELEN,sfile);
  61.         rip(hostent);
  62.         cp = hostent;
  63.         if(*cp == '#' || !isdigit(*cp))
  64.             continue;    /* Comment or invalid line */
  65.         while(cp != NULLCHAR){
  66.             /* Skip white space */
  67.             while(*cp == ' ' || *cp == '\t')
  68.                 cp++;
  69.             if(*cp == '\0')
  70.                 break;
  71.             /* Look for next token, find length of this one */
  72.             if((cp1 = index(cp,'\t')) != NULLCHAR){
  73.                 i = cp1 - cp;
  74.             } else if((cp1 = index(cp,' ')) != NULLCHAR) {
  75.                 i = cp1 - cp;
  76.             } else {
  77.                 i = strlen(cp);
  78.             }
  79.             if(strlen(host) == i && strncasecmp(host,cp,i) == 0){
  80.                 /* Found it, put in cache */
  81.                 fclose(sfile);
  82.                 if(cache.name != NULLCHAR)
  83.                     free(cache.name);
  84.                 cache.name = malloc((unsigned)strlen(host)+1);
  85.                 strcpy(cache.name,host);
  86.                 cache.address = aton(hostent);
  87.                 return cache.address;
  88.             }
  89.             /* That one didn't match, try the next one */
  90.             cp = cp1;
  91.         }
  92.     }
  93.     /* No address found */
  94.     fclose(sfile);
  95.     return 0;
  96. }
  97.  
  98. /* Convert an internet address (in host byte order) to a dotted decimal ascii
  99.  * string, e.g., 255.255.255.255\0
  100.  */
  101. char *
  102. inet_ntoa(a)
  103. int32 a;
  104. {
  105.     static char buf[16];
  106.  
  107.     sprintf(buf,"%u.%u.%u.%u",
  108.         hibyte(hiword(a)),
  109.         lobyte(hiword(a)),
  110.         hibyte(loword(a)),
  111.         lobyte(loword(a)) );
  112.     return buf;
  113. }
  114. /* Convert a socket (address + port) to an ascii string of the form
  115.  * aaa.aaa.aaa.aaa:ppppp
  116.  */
  117. char *
  118. psocket(s)
  119. struct socket *s;
  120. {
  121.     static char buf[30];
  122.  
  123.     sprintf(buf,"%s:%u",inet_ntoa(s->address),s->port);
  124.     return buf;
  125. }
  126. /* Convert hex-ascii string to long integer */
  127. long
  128. htol(s)
  129. char *s;
  130. {
  131.     long ret;
  132.     char c;
  133.  
  134.     ret = 0;
  135.     while((c = *s++) != '\0'){
  136.         c &= 0x7f;
  137.         if(c >= '0' && c <= '9')
  138.             ret = ret*16 + (c - '0');
  139.         else if(c >= 'a' && c <= 'f')
  140.             ret = ret*16 + (10 + c - 'a');
  141.         else if(c >= 'A' && c <= 'F')
  142.             ret = ret*16 + (10 + c - 'A');
  143.         else
  144.             break;
  145.     }
  146.     return ret;
  147. }
  148.